/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.asportoonline.actions;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.asportoonline.business.beans.CategoriaManager;
import org.asportoonline.business.beans.LocaleManager;
import org.asportoonline.business.beans.ProdottoManager;
import org.asportoonline.business.delegates.CategoriaManagerDelegate;
import org.asportoonline.business.delegates.LocaleManagerDelegate;
import org.asportoonline.business.delegates.ProdottoManagerDelegate;
import org.asportoonline.entities.Categoria;
import org.asportoonline.entities.Locale;
import org.asportoonline.entities.Prodotto;

/**
 *
 * @author fe
 */
public class ProdottoAction extends HttpServlet {
    
    private LocaleManager lm = new LocaleManagerDelegate();
    private ProdottoManager pm = new ProdottoManagerDelegate();
    private CategoriaManager catm = new CategoriaManagerDelegate();
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String s = request.getParameter("q").toString();
        
        if(s.equals("register_product_action")) {
            String res = registra_prodotto(request);
            String idlocale = request.getParameter("idlocale").toString();
            if(res.equals("OK")) {
                getServletContext().getRequestDispatcher("/MainController?q=fetch_restaurant_details_action&ret=restaurant_details&idlocale="+idlocale).forward(request, response);
            }
            else {                
                request.setAttribute("error", res);
                getServletContext().getRequestDispatcher("/MainController?q=register_product&idlocale="+idlocale).forward(request, response);
            }
        }
        
        else if(s.equals("fetch_product_details_action")) {
            String ret = request.getParameter("ret").toString();            
            recupera_dati_prodotto(request);
            request.setAttribute("lista_categorie", catm.cercaTutteLeCategorie());
            getServletContext().getRequestDispatcher("/MainController?q="+ret).forward(request, response);
        }
        
        else if(s.equals("modify_product_action")) {
            String res = modifica_prodotto(request);
            String idprodotto = request.getParameter("idprodotto").toString();
//            request.setAttribute("error", idprodotto);
//            getServletContext().getRequestDispatcher("/MainController?q=index").forward(request, response);
//            
            if(res.equals("OK")) {                
                Prodotto p = pm.cercaProdotto(Integer.parseInt(idprodotto));
                long idlocale = p.getLocale().getIdLocale();
                getServletContext().getRequestDispatcher("/MainController?q=fetch_restaurant_details_action&ret=restaurant_details&idlocale="+idlocale).forward(request, response);
            }
            else {
                request.setAttribute("error", res);
                getServletContext().getRequestDispatcher("/MainController?q=fetch_product_details_action&ret=modify_product&idprodotto="+idprodotto).forward(request, response);
            }
        }
    }
    
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    private String registra_prodotto(HttpServletRequest request) {
        int idlocale = Integer.parseInt(request.getParameter("idlocale").toString());
        String nome = request.getParameter("nome").toString().trim();
        String categoria = request.getParameter("categoria").toString().trim();
        String descrizione = request.getParameter("descrizione").toString().trim();
        String urlimmagine = request.getParameter("urlimmagine").toString().trim();
        String price = request.getParameter("prezzo").toString().trim();
        double prezzo;
        Locale l;
        Categoria cat;
        
        /* CONTROLLI SUI CAMPI */
        // i campi obbligatori sono nome, categoria, prezzo
        if(price.isEmpty()) {
            return "Inserire il prezzo del prodotto";
        }
        else {
            try {
                prezzo = Double.parseDouble(price);
            } catch(NumberFormatException ne) {
                return "Il prezzo inserito non e' corretto";
            }
        }
        
        if(categoria.equals("none")) {
            return "Inserire la categoria!!!";
        }
        else {
            cat = catm.cercaCategoria(categoria);
        }
        
        //Il nome del prodotto deve essere univoco all'interno di un locale
        if(nome.isEmpty()) {
            return "Inserire il nome del prodotto!!!";
        }
        else {
            l = lm.cercaLocale(idlocale);
            if(l==null) {  //teoricamente non fallisce mai!!
                return "Locale non trovato!!";
            }
            
            Prodotto prod = pm.cercaProdottoDelLocale(nome, l);
            if(prod != null) {
                return "Questo locale ha gia' un prodotto con lo stesso nome!!";
            }
        }
        
        
        Prodotto p = new Prodotto();
        p.setNome(nome);
        p.setCategoria(cat);
        p.setPrezzo(prezzo);
        p.setDescrizione(descrizione);
        if(!urlimmagine.isEmpty())      p.setUrlimmagine(urlimmagine);
        p.setLocale(l);
        
        pm.inserisciProdotto(p);
        
        return "OK";
    }

    private void recupera_dati_prodotto(HttpServletRequest request) {
        int idprodotto = Integer.parseInt(request.getParameter("idprodotto").toString());
        Prodotto p = pm.cercaProdotto(idprodotto);
        request.setAttribute("prodotto", p);
    }

    private String modifica_prodotto(HttpServletRequest request) {
        int idprodotto = Integer.parseInt(request.getParameter("idprodotto").toString());
        String nome = request.getParameter("nome").toString().trim();
        String categoria = request.getParameter("categoria").toString().trim();
        String descrizione = request.getParameter("descrizione").toString().trim();
        String urlimmagine = request.getParameter("urlimmagine").toString().trim();
        String price = request.getParameter("prezzo").toString().trim();
        double prezzo;
        Prodotto p;
        Categoria cat;
        
        /* CONTROLLI SUI CAMPI */
        // i campi obbligatori sono nome, categoria, prezzo
        if(price.isEmpty()) {
            return "Inserire il prezzo del prodotto";
        }
        else {
            try {
                prezzo = Double.parseDouble(price);
            } catch(NumberFormatException ne) {
                return "Il prezzo inserito non e' corretto";
            } 
        }
        
        if(categoria.equals("none")) {
            return "Inserire la categoria!!!";
        }
        else {
            cat = catm.cercaCategoria(categoria);
        }
        
        //Il nome del prodotto deve essere univoco all'interno di un locale
        if(nome.isEmpty()) {
            return "Inserire il nome del prodotto!!!";
        }
        else {
            p = pm.cercaProdotto(idprodotto);
            if(!p.getNome().equals(nome)) {
                Locale l = p.getLocale();
                if(pm.cercaProdottoDelLocale(nome, l) != null) {
                    return "Nome prodotto non disponibile all'interno del locale "+l.getNome();
                }
            }
        }
        
        p.setNome(nome);
        p.setCategoria(cat);
        p.setPrezzo(prezzo);
        p.setDescrizione(descrizione);
        p.setUrlimmagine(urlimmagine);
        
        pm.aggiornaProdotto(p);
        
        return "OK";
    }
    
    
}
